`

常用设计模式----工厂设计模式

 
阅读更多
package org.design.patterns;

/**
 * 简单工厂: 把new对象的操作提取出来,放到一个类中,由该类统一负责对象的创建,这个类就可以称为 简单工厂。
 * 如果把该工厂中创建对象的方法定义为static的,就称为是静态工厂(显然,这种不能被子类继承)
 */

class Product {// 简单的产品类,这里为了简单地说明问题,没有考虑产品的抽象
 protected int id;
 protected String name;
 protected String type;

 // ...
}

class SimpleFactory {
 public Product createProduct(String productType) {
  Product pro = new Product();

  return pro;
 }
}

// class StaticSimpleFactory {
// public static Product createProduct(String productType) {
// Product pro = new Product();
//
// return pro;
// }
// }

class ProductStore {
 SimpleFactory simpleFactory;

 public ProductStore(SimpleFactory simpleFactory) {
  this.simpleFactory = simpleFactory;
 }

 public Product initProduct(String type) {// 这里的产品
            // type可以考虑用static常量或枚举类型以减少出错哦
  // 得到产品
  Product pro = simpleFactory.createProduct(type);
  // StaticSimpleFactory.createProduct(type);//静态工厂,缺点是createProduct不能被子类重写

  // 其他操作
  // ....

  return pro;
 }
}

// 这样就可通过ProductStore.initProduct得到想要的产品

// ====================================
/**
 * 工厂方法模式: 定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化延迟到子类。
 */
abstract class FactoryMethodStore {

 public Product initProduct(String type) {
  Product pro = createProduct(type);// 不需要知道生产的具体产品,而是由子类决定。

  // ...

  return pro;
 }

 abstract Product createProduct(String type);// 抽象类的抽象工厂方法,需要子类实现
}

class MyFactoryMethodStore extends FactoryMethodStore {

 @Override
 Product createProduct(String type) {
  Product pro = new Product();

  return pro;
 }
}

// 这样就可通过MyFactoryMethodStore.initProduct得到想要的产品

/*
 * 工厂方法模式中用到了一个重要的设计原则,依赖倒置原则: 依赖倒置原则: 要依赖抽象,不要依赖具体类。 -----
 * “倒置”也是一种思想,就是不理会具体实现类的情况下去设计,
 * 例如FactoryMethodStore的initProduct方法调用了抽象的createProduct却不考虑其具体实现。
 */

// ======================================

/**
 * 抽象工厂模式:
 * 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
 * 
 * 
 */

// Product_1,Product_2,Product_3是一个产品族的不同产品,这里为了简单没有考虑产品间的继承关系
class Product_1 {
 protected int id;
 protected String name;
 protected String type;

 // ...
}

class Product_2 {
 protected int idd;
 protected String namee;
 protected String typee;

 // ...
}

class Product_3 {
 protected int iddd;
 protected String nameeee;
 protected String typeeee;

 // ...
}

// 创建一族产品的工厂接口,当然如果内部有通用的实现的话也可写成抽象类的形式
interface AbstractFactory {
 public Product_1 createProOne();

 public Product_2 createProTwo();

 public Product_3 createProThree();
}

class ProductFamily {
 AbstractFactory abstractFactory;

 public ProductFamily(AbstractFactory abstractFactory) {
  this.abstractFactory = abstractFactory;
 }

 /**
  * 创建一个产品族
  */
 public void createFamily() {// 依赖于接口,没有理会具体实现类,而进行的设计----依赖倒置原则
  Product_1 pro1 = abstractFactory.createProOne();
  Product_2 pro2 = abstractFactory.createProTwo();
  Product_3 pro3 = abstractFactory.createProThree();
          
  System.out.println(pro1+"&"+ pro2+"&"+pro3);
  // ...
 }
}
/**
 *抽象工厂的具体实现类,其实就是一个工厂方法。
 *抽象工厂每个方法都声明成抽象,而子类的方法对这些抽象方法实现来创建具体对象。
 */
class MyAbstractFactory implements AbstractFactory {

 @Override
 public Product_1 createProOne() {
  Product_1 pro1 = new Product_1();

  // ...
  return pro1;
 }

 @Override
 public Product_2 createProTwo() {
  Product_2 pro2 = new Product_2();

  // ...
  return pro2;
 }

 @Override
 public Product_3 createProThree() {
  Product_3 pro3 = new Product_3();

  // ...
  return pro3;
 }
}
//通过调用new ProductFamily(new MyAbstractFactory());就可以创建一个产品族了。
 //=============================

/*总结:
 * 1.所有的工厂都是用来封装对象的创建;
 * 2.简单工厂,虽然不是真正的设计模式,但仍不失为一直简单的方法,可以将客户程序从具体类中解耦;
 * 3.工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象,将实例化延迟到了子类;
 * 4.抽象工厂使用对象组合:创建对象家族时不需要考虑具体实现,实现了接口的实现类 的方法中(实现类又是工厂方法)有具体对象的创建;
 * 5.所有的工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合;
 * 6.依赖倒置原则:避免依赖具体类型,尽量依赖抽象。
 */
分享到:
评论

相关推荐

    java常用设计模式-工厂模式的实现.doc

    java常用设计模式-工厂模式的实现.doc

    java常用设计模式-工厂模式

    Java常用设计模式-工厂模式 工厂模式(Factory Pattern)是一种常用的设计模式,它通过一个工厂类来实现对象的创建,而无需直接暴露对象的创建逻辑给客户端。这种模式可以使客户端代码与具体的产品类解耦,提高代码...

    java常用设计模式-抽象工厂模式

    java常用设计模式-抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建...

    java常用设计模式-空对象模式

    java常用设计模式-空对象模式 空对象模式(Null Object Pattern)是一种行为设计模式,它允许我们在不返回 null 的情况下提供默认行为。这种模式通常用于需要处理 null 对象的情况下,以避免NullPointerException ...

    java设计模式---诙谐易懂版

    5. 文件中提到的24种设计模式,涵盖了大多数常用的模式。例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、...

    设计模式----工厂模式

    工厂模式是设计模式中的一个基础且常用的模式,它属于创建型模式,主要解决对象创建时的复杂性问题,使得代码在不指定具体类的情况下能够创建对象。 在《设计模式——工厂模式》这篇博文中,作者可能详细阐述了工厂...

    设计模式--工厂模式java例子

    设计模式是软件开发中的一种最佳实践,用于解决常见的...总的来说,工厂模式是Java编程中常用的设计模式之一,尤其适用于需要根据条件创建不同对象的情况。理解并熟练应用工厂模式,能够提高代码的可维护性和可扩展性。

    Java设计模式教程 - Java设计模式 - 工厂模式

    工厂模式作为最常用的设计模式之一,是创建型模式的代表,它的主要目标是提供一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。这样,用户在使用时无需知道具体创建的对象是什么类型,只需通过工厂...

    c#设计模式-工厂模式

    工厂模式是一种常用的设计模式,它的主要目的是通过抽象出产品创建过程,使得客户端代码不再直接new对象,而是通过工厂来获取对象,从而降低了代码之间的耦合度,提高了系统的可扩展性。工厂模式分为简单工厂模式、...

    设计模式-简单工厂模式-例题

    简单工厂模式(Simple Factory Pattern)是一种常用的创建型设计模式。它提供了一种方式来封装对象的创建过程,使得整个系统更加灵活,易于扩展。在简单工厂模式中,存在一个专门用于创建对象的工厂类,它负责根据...

    JAVA常用设计模式-追美眉技术详解.doc

    ### Java常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。通过应用这些模式,开发人员可以编写出更易于理解、扩展和维护的代码...

    JAVA设计模式例程-工厂模式-1

    工厂模式是其中最常用和基础的设计模式之一,它属于创建型模式,主要用来抽象创建对象的过程,使得代码更加灵活,易于扩展。这个名为"JAVA设计模式例程-工厂模式-1"的压缩包文件提供了一个关于工厂模式的实例,可以...

    设计模式-工厂模式.pdf

    工厂模式是一种常用的设计模式,属于创建型模式之一。它的核心思想在于将对象的创建过程封装起来,并通过特定的工厂类来实现对象的创建,以此达到降低系统耦合度的目的。在实际应用中,工厂模式可以有效地管理对象的...

    JAVA常用设计模式-追美眉技术详解

    ### JAVA常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。Java作为一种广泛应用的编程语言,其设计模式对于提高代码质量、增强...

    设计模式-工厂模式

    工厂模式是一种常用的设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,而是引用一个共同的接口来指向新创建的对象。这种模式的主要优点是...

    游戏设计4-工厂模式-锻造武器

    游戏设计中的工厂模式是一种常用的软件设计模式,它在游戏开发中尤其重要,因为游戏往往涉及到大量对象的创建和管理。在这个“游戏设计4-工厂模式-锻造武器”的主题中,我们将深入探讨工厂模式如何应用于游戏中的...

    常用设计模式demo代码-design.rar

    下面我们将深入探讨标题和描述中提到的四种设计模式:单例模式、工厂模式、观察者模式以及模板模式。 1. **单例模式**: 单例模式是一种限制类实例化次数为一次的设计模式,确保在整个应用程序中只有一个实例存在...

    c#几种常用的设计模式

    以下是对标题和描述中提到的几种常用C#设计模式的详细解释: 1. **单例模式(Singleton)**: - 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有化构造函数和静态成员来实现。这样可以...

Global site tag (gtag.js) - Google Analytics