23种设计模式-工厂方法模式

一.工厂方法模式介绍  工厂,生活中工厂是干什么的,是生产东西的。比如衣服加工厂,我们衣服卖家只需要从厂里面拿衣服,只需要看衣服是否是我想要的,衣服具体生产过程我不需要知道,这个我们就可以任务是简单工厂。  在《设计模式之禅》中用女娲造人来打开工厂模式的入口,把八卦炉比喻成工厂,这个比喻个人感觉很恰当。下面为了和女娲造人的区分开,我还是用加工衣服的例子来讲解下工厂模式。
二.工厂模式运用
   我们先来看下UML图

   

图画的好不好,烂不烂我们先不说(我感觉怎么那么不专业)。从图中能看出我们需要创建一个服装接口,有start,colour,package三个方法,然后所有的衣服都实现服装接口,然后工厂类去构建各种衣服。

接口类代码

 1 public interface IClothing {
 2
 3     /**
 4      * 开始制作
 5      */
 6     void start();
 7     /**
 8      * 上色
 9      */
10     void colour();
11     /**
12      * 打包
13      */
14     void pack();
15 }

内衣代码

 1 public class Underwear implements IClothing {
 2
 3     public void start()
 4     {
 5         System.out.println("正在制作内衣...");
 6     }
 7     public void colour()
 8     {
 9         System.out.println("给内衣上色...");
10     }
11     public void pack()
12     {
13         System.out.println("内衣制作完包装...");
14     }
15 }

外套代码

 1 public class Coat implements IClothing {
 2
 3     public void start()
 4     {
 5         System.out.println("正在制作外套...");
 6     }
 7     public void colour()
 8     {
 9         System.out.println("给外套上色...");
10     }
11     public void pack()
12     {
13         System.out.println("外套制作完包装...");
14     }
15
16 }

裤子代码

 1 public class Trousers {
 2
 3     public void start()
 4     {
 5         System.out.println("正在制作裤子...");
 6     }
 7     public void colour()
 8     {
 9         System.out.println("给裤子上色...");
10     }
11     public void pack()
12     {
13         System.out.println("裤子制作完包装...");
14     }
15
16 }

工厂方法类

 1 public class ClothingFactory {
 2
 3     public static IClothing createClothing(Class c)
 4     {
 5         IClothing traffic = null;
 6         try {
 7             traffic =(IClothing)Class.forName(c.getName()).newInstance();
 8         }catch (InstantiationException e)
 9         {
10             throw new RuntimeException("对象创建出错");
11         }
12         catch (IllegalAccessException e)
13         {
14             throw new RuntimeException("你调用错了吧");
15         }
16         catch (ClassNotFoundException e)
17         {
18             throw new RuntimeException("类都找不到你让我怎么搞");
19         }
20         return traffic;
21     }
22 }

客户端调用代码

 1 public static void main(String [] args)
 2     {
 3         IClothing underwear = ClothingFactory.createClothing(Underwear.class);
 4         underwear.start();
 5         underwear.colour();
 6         underwear.pack();
 7         IClothing coat = ClothingFactory.createClothing(Coat.class);
 8         coat.start();
 9         coat.colour();
10         coat.pack();
11         IClothing trousers = ClothingFactory.createClothing(Trousers.class);
12         trousers.start();
13         trousers.colour();
14         trousers.pack();
15     }

运行结果

这样子工厂方法我们就写完了,看运行结果是不是也是大家想的到的,现在我们反思下,如果我把工厂方法去了,不也是在调用端实例然后调用接口的三个方法么?

三.总结

上面的反思想过了么,如果想过了,答案是什么呢?现在我们来看下工厂方法比传统方法的优缺点,看完就知道答案了。

优点

1.调用方只知道有个工厂,不知道我有哪些方法

2.通过工厂构建,不用每个都自己构建,减少代码量

缺点

1.比如新增写在就要在方法中新增一个类

我写的代码其实有个弊端,那就是调用方要知道我具体实现的类是哪个,这样子就加大了耦合。



原文地址:https://www.cnblogs.com/zhxcy/p/11230881.html

时间: 2024-10-16 00:26:18

23种设计模式-工厂方法模式的相关文章

Java经典23种设计模式之创造型模式(二)

本文记录5种创造型模式的剩下两种:建造者模式(Builder).原型模式(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示.一个完整的建造者模式包含以下几个概念: 1.产品类 Product public class Person { private String head; private String body; private String foot; public String getHead() { ret

php设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——工厂方法模式(Factory Method) 4 */ 5 6 7 /* 8 * IAp

Android设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

Java设计模式-工厂方法模式(Factory Method)

工厂方法模式(Factory Method) 工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建.在以下的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式. 1:普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建 例,按下图写一个普通工厂方法模式 首先,创建共同接口sender public interface Sender

Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = '[email protected]' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大学生帮你买米' def sweep(self

4. 星际争霸之php设计模式--工厂方法模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248177.html============================================

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

JAVA设计模式--工厂方法模式

工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关的代码.由应用程序调用以创建对应的具体产品的对象.在java中它由具体的类来实现.抽象产品角色:它是具体产品继承的父类或者是实现的接口.在java中一般有抽象类或者接口来实现.具体产品角色:具体工厂角色所创建的对象就是此角色的实例.在java中由具体的类来实现. 下面以IE,火狐,谷歌浏览器为模型做