设计模式--10、工厂方法和抽象工厂模式

[转载]Java 之工厂方法和抽象工厂模式

1. 概念

工厂方法:一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。

即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系。

抽象工厂:多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。

即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。“一对多”的关系。

2. UML

工厂方法:

抽象工厂:

3. 代码

工厂方法:

public interface Product{       }

public interface Creator{       public Product factory();}

public class ConcreteProduct1 implements Product{       public ConcreteProduct1()       {              System.out.println("ConcreteProduct1被创建");       }}

public class ConcreteProduct2 implements Product{       public ConcreteProduct2()       {              System.out.println("ConcreteProduct2被创建");       }

}

public class ConcreteCreator1 implements Creator{       public Product factory()       {              return new ConcreteProduct1();       }}

public class ConcreteCreator2 implements Creator{       public Product factory()       {              return new ConcreteProduct2();       }}

public class Client{       private static Creator creator1, creator2;       private static Product prod1, prod2;

       public static void main(String[] args)       {              creator1 = new ConcreteCreator1();              prod1 = creator1.factory();              System.out.println("----------------------------");              creator2 = new ConcreteCreator2();              prod2 = creator2.factory();       }}

抽象工厂:

//定义不同的产品之间的一定具备的标准,用interface实现 //其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能 interface IProductA{   public void method(); } 

interface IProductB{   public void method(); } 

//实现了产品标准实现的一系列具体产品 //由于已经设计好A1由厂商1生产,故以下输出代码有“厂商x” class ProductA1 implements IProductA{   public void method() {     System.out.println("厂商1    生产ProductA1 ...");   } } 

class ProductA2 implements IProductA{   public void method() {     System.out.println("厂商2    生产ProductA2 ...");   } } 

class ProductB1 implements IProductB{   public void method() {     System.out.println("厂商1    生产ProductB1 ...");   } } 

class ProductB2 implements IProductB{   public void method() {     System.out.println("厂商2    生产ProductB2 ...");   } } 

//每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产 abstract class Factory1{   abstract IProductA getProductA1();   abstract IProductB getProductB1(); } 

abstract class Factory2{   abstract IProductA getProductA2();   abstract IProductB getProductB2(); } 

//具体的工厂用来生产相关的产品 class ConcreteFactory1 extends Factory1{   public IProductA getProductA1() {     return new ProductA1();   }   public IProductB getProductB1() {     return new ProductB1();   } } 

class ConcreteFactoryB extends Factory2{   public IProductA getProductA2() {     return new ProductA2();   }   public IProductB getProductB2() {     return new ProductB2();   } } 

//测试类 public class Client {   public static void main(String[] args) {     //厂商1负责生产产品A1、B1     Factory1 factory1 = new ConcreteFactory1();     IProductA productA1 = factory1.getProductA1();     IProductB productB1 = factory1.getProductB1(); 

    productA1.method();     productB1.method(); 

    //厂商2负责生产产品A2、B2     Factory2 factory2 = new ConcreteFactoryB();     IProductA productA2 = factory2.getProductA2();     IProductB productB2 = factory2.getProductB2(); 

    productA2.method();     productB2.method();   } }

4. 应用场景

工厂方法:

在以下情况下,适用于工厂方法模式:

(1) 当一个类不知道它所必须创建的对象的类的时候。

(2) 当一个类希望由它的子类来指定它所创建的对象的时候。

(3) 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

抽象工厂:

(1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。

(2) 这个系统有多于一个的产品族,而系统只消费其中某一产品族。

(3) 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。

(4) 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

时间: 2024-10-16 14:10:48

设计模式--10、工厂方法和抽象工厂模式的相关文章

设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的问题? 是什么?通过Python语言来去实现这个设计模式,用于解决为什么中提到的问题. 怎么用?理解了为什么我们也就基本了解了什么情况下使用这个模式,不过在这里还是会细化使用场景,阐述模式的局限和优缺点. 这次的主角是简单工厂,工厂方法和抽象工厂模式,由于这几个模式联系紧密,有一定的相似性,所以放在

【转】设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解. 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 不修改代码的话,是无法扩展的. 工厂方法 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 在同一等级结构中,支持增加任意产品. 抽象工厂 抽象工厂是应

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解. 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 不修改代码的话,是无法扩展的. 工厂方法 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 在同一等级结构中,支持增加任意产品. 抽象工厂 抽象工厂是应

重头开始学23种设计模式:三大工厂(简单工厂,工厂方法,抽象工厂)

在开发当中我们经常会使用三个设计模式,来帮我们解决项目代码的可扩展性. 在简单工厂,工厂方法,抽象工厂这三个设计模式当中,代码其实都很简单,主要是要理解运用. 简单工厂: 简单工厂说白了,就是利用Switch根据传递的参数,进行实例化. 工厂方法: 工厂方法,为解决每次都去增加Swicth的简单工厂的升级.为每一个产品提供一个工厂类. 抽象工厂: 抽象工厂,我觉得也是对工厂方法的再次升级,工厂方法每次只能创作一个产品,而抽象工厂就是产品线的产品族. 总结下,从网上找到一个大牛的回复: 我认为不能

Java工厂模式(简单工厂、工厂方法、抽象工厂)

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂(Abstract Factory). 简单工厂(Simple Factory)又叫静态工厂,是工厂模式三中状态中结构最为简单的.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.我们来看一个具体的例子:假设一家工厂,几生产洗衣机,有生产冰箱

Java设计模式之简单工厂、工厂方法和抽象工厂

在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则的类以及工厂模式在解耦中的威力. class FoodStore { public Food orderFood() //通过此方法顾客从食物商店中得到食物 { Food food=new Food(); food.prepare(); // 准备食物 food.cut(); // 将食物切好 fo

设计模式系列---简单工厂、工厂方法、抽象工厂

前言,最近看spring的源代码.发现之前没有完全弄懂(工厂方法.抽象工厂)的区别. spring中代理对象的产生,是通过代理工厂(工厂模式),首先spring中的代理是使用jdk或者cglib的代理,只要看目标类是否实现接口. public class ProxyFactory extends ProxyCreatorSupport { //createAopProxy()方法是通过AopProxyFactory获取AopProxy(JDK,CGLIB) public Object getPr

工厂模式—工厂方法与抽象工厂的战争

概述 什么是工厂方法?什么是抽象工厂? 工厂方法是指工厂生产产品,而抽象工厂是生产产品系列.例如,工厂方法是只生产运输工具比如马车.公共汽车.自行车,而抽象工厂生产轮胎.螺丝钉交通工具零件. 工厂方法模式定义了一个创建对象的接口,但由子类决定实例化的类是哪一个.工厂方法让类把实例化推迟到子类. 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 简单工厂 交通工具创建者类 public interface VehicleFactory { Vehicle creat

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有