JAVA中的设计模式二(工厂模式)

简介: 工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。   工厂模式主要有: 简单工厂模式,工厂方法,抽象工厂;     简单工厂: 又叫静态工厂,是工厂模式三中状态中结构最为简单的。

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。

 

工厂模式主要有:

简单工厂模式,工厂方法,抽象工厂;

 

 

简单工厂:

又叫静态工厂,是工厂模式三中状态中结构最为简单的。主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例。我们来看一个具体的例子:

如下面价单的图形

 

 

代码如下:
首先我们先创建一个抽象的产品:

1 package Factory;
2 
3 public abstract  class BMW {
4 
5     public BMW() {
6     }
7     
8 }

然后我们具体的产品类去继承我们的抽象产品:

 1 public class BMW320 extends BMW{
 2     public BMW320() {
 3         // TODO Auto-generated constructor stub
 4         System.out.println("生产BMW320");
 5     }
 6 }
 7 
 8 
 9 
10 
11 
12 public class BMW523 extends BMW{
13     public BMW523() {
14         // TODO Auto-generated constructor stub
15         System.out.println("生产BMW523");
16     }
17 }

 

 

下面我们创建我们的工厂:

 1 package Factory;
 2 
 3 public class Factory {
 4     public BMW crateBMW(int type){
 5         if(type==320){
 6             return new BMW320();
 7         }else if (type==523){
 8             return new BMW523();
 9         }else{
10             return null;
11         }
12     }
13     }

 

 

下面就是客户了,客户需要产品,我们进行生产:

1 package Factory;
2 
3 public class Customer {
4     public static void main(String[] args) {
5         Factory f=new Factory();
6         BMW b320=f.crateBMW(320);
7         BMW b523=f.crateBMW(523);
8     }
9 }

 

运行的结果如下-----:

这个就是简单的工厂模式;

上面的代码告诉我们,简单工厂并不简单,它是整个模式的核心,一旦他出了问题,整个模式都将受影响而不能工作,为了降低风险和为日后的维护、扩展做准备,我们需要对它进行重构,引入工厂方法。

 

工厂方法:

工厂方法其实就是,不同额工厂对应不同的产品,就算其中某一个工厂不能正常工作了,也不会影响到其他的工厂工作;

 

 

首先我们先创建 产品接口和对应的具体产品

 1 public interface Product {
 2     
 3 }
 4 
 5 
 6 public class Washer implements Product{
 7 
 8     public Washer() {
 9         System.out.println("洗衣机被制造了");
10     }
11     
12 }
13 
14 
15 
16 public class AirCondition implements Product{
17 
18     public AirCondition() {
19         System.out.println("空调被制造了");
20     }
21 }

 

 

然后我们再创建 工厂接口和对应的具体生产不同商品的工厂

public interface Factory {
    
}



public class WasherFactory implements Factory{
    
    public Product make(){
        return new Washer();
    }
}




public class AirConditionFactory implements Factory{
    public Product make(){
        return new AirCondition();
    }
}

 

最后就是顾客了,

 1 package Factory2;
 2 
 3 public class Customer {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         
 8         WasherFactory f=new WasherFactory();
 9         Product w=f.make();
10         
11         AirConditionFactory f2=new AirConditionFactory();
12         Product w2=f2.make();
13     }
14 }

 

 

运行的结果为:

可以理解为:有了很多个工厂方法,自己需要哪一个产品,就调用当前产品的工厂方法,获取相应的具体实例。

 

从上面创建产品对象的代码可以看出,工厂方法和简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

 

抽象方法:

抽象工厂:意的意图在于创建一系列互相关联或互相依赖的对象。
我自己觉得抽象工厂是在工厂方法的基础上引进了分类管理的概念....
工厂方法用来创建一个产品,它没有分类的概念,而抽象工厂则用于创建一系列产品,所以产品分类成了抽象工厂的重点,
我们继续用上面的例子来说明:
工厂生产的所有产品都用都用大写字母来标明它们的型号,比如冰箱,就有“冰箱-A",“冰箱-B",同样,其他的产品也都是遵守这个编号规则,于是就有了一下产品家族树

 

 

首先:我们创造不同的 电视和鼠标的接口:

1 public interface TV {
2 }
3 
4 
5 public interface Mouse {
6 
7 }

 

 然后我们创造冰箱和鼠标的不同的品种:

 1 public class TV_A implements TV{
 2 
 3     public TV_A() {
 4         System.out.println("A型TV");
 5     }
 6 
 7 }
 8 
 9 
10 public class TV_B implements TV{
11     
12     public TV_B() {
13         System.out.println("B型TV");
14     }
15     
16 }
17 
18 
19 public class Mouse_A implements Mouse{
20 
21     public Mouse_A() {
22         System.out.println("A型鼠标");
23     }
24 
25 }
26 
27 
28 public class Mouse_B implements Mouse{
29 
30     public Mouse_B() {
31         System.out.println("B型鼠标");
32     }
33 
34 }

 

 最后就等到了不同类型的工厂,生产不同类型的产品。如A工厂只生产A类型的产品

public class Factory_A implements Factory{

    @Override
    public TV createTv() {
        // TODO Auto-generated method stub
        return new TV_A();
    }

    @Override
    public Mouse createMouse() {
        // TODO Auto-generated method stub
        return new Mouse_A();
    }

}



public class Factory_B implements Factory{

    @Override
    public TV createTv() {
        // TODO Auto-generated method stub
        return new TV_B();
    }

    @Override
    public Mouse createMouse() {
        // TODO Auto-generated method stub
        return new Mouse_B();
    }
    
}

 

 最后就是测试类:

 1 package Foctory3;
 2 
 3 public class Customer {
 4     public static void main(String[] args) {
 5         Factory f=new Factory_A();
 6         f.createTv();
 7         f.createMouse();
 8         
 9         f=new Factory_B();
10         f.createTv();
11         f.createMouse();
12     }
13 }

 

运行结果如图所示:

 

欢迎大家一起说出自己的想法。
目录
相关文章
|
12天前
|
设计模式 Java 开发者
设计模式揭秘:Java世界的七大奇迹
【4月更文挑战第7天】探索Java设计模式:单例、工厂方法、抽象工厂、建造者、原型、适配器和观察者,助你构建健壮、灵活的软件系统。了解这些模式如何提升代码复用、可维护性,以及在特定场景下的应用,如资源管理、接口兼容和事件监听。掌握设计模式,但也需根据实际情况权衡,打造高效、优雅的软件解决方案。
|
14天前
|
设计模式 存储 Java
23种设计模式,享元模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享技术有效地支持大量细粒度对象的重用。这个模式在处理大量对象时非常有用,特别是当这些对象中的许多实例实际上可以共享相同的状态时,从而可以减少内存占用,提高程序效率
31 4
|
14天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
30 4
|
17天前
|
设计模式 Java 数据库
Java设计模式精讲:让代码更优雅、更可维护
【4月更文挑战第2天】**设计模式是解决软件设计问题的成熟方案,分为创建型、结构型和行为型。Java中的单例模式确保类仅有一个实例,工厂方法模式让子类决定实例化哪个类。适配器模式则协调不兼容接口间的合作。观察者模式实现了一对多依赖,状态变化时自动通知相关对象。学习和适当应用设计模式能提升代码质量和可维护性,但需避免过度使用。设计模式的掌握源于实践与不断学习。**
Java设计模式精讲:让代码更优雅、更可维护
|
21天前
|
设计模式 安全 Java
在Java中即指单例设计模式
在Java中即指单例设计模式
15 0
|
12天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
1月前
|
设计模式 存储 安全
Java设计模式---结构型模式
Java设计模式---结构型模式
|
1天前
|
设计模式 算法 Java
Java中的设计模式及其应用
【4月更文挑战第18天】本文介绍了Java设计模式的重要性及分类,包括创建型、结构型和行为型模式。创建型模式如单例、工厂方法用于对象创建;结构型模式如适配器、组合关注对象组合;行为型模式如策略、观察者关注对象交互。文中还举例说明了单例模式在配置管理器中的应用,工厂方法在图形编辑器中的使用,以及策略模式在电商折扣计算中的实践。设计模式能提升代码可读性、可维护性和可扩展性,是Java开发者的必备知识。
|
4天前
|
设计模式 算法 Java
小谈设计模式(30)—Java设计模式总结
小谈设计模式(30)—Java设计模式总结
|
5天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
12 1