模式的秘密--工厂模式

工厂模式概念:

  1. 实例化对象,用工厂方法代替new操作
  2. 工厂模式包括工厂方法模式和抽象工厂模式
  3. 抽象工厂模式是工厂方法模式的扩展

工厂模式的意图:

  1. 定义一个接口创建对象,但是让子类决定哪些类需要被实例化。
  2. 工厂方法把实例化的工作推迟到子类去实现。

什么情况下适合工厂模式

  1. 有一组类似的对象需要创建。
  2. 在编码时候不能预见需要创建哪种类的实例。
  3. 系统需要考虑扩展性,不应依赖于产品类实例如何被创建,组合和表达的细节。

工厂模式的动机

项目中的现状:

软件系统中经常面临对象的创建工作,由于需求的变化,这个对象可能也随之发生变化,但他却拥有比较稳定的接口。

为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象的对象不随之需求变化而变化。

基于项目现状将代码进行如下设计:

1,尽量松耦合,一个对象的依赖对象的变化与本身无关。

2,具体产品与客户端剥离,责任分割。

项目:

说明:

实现代码:

先定义一个接口:发型接口:

package com.Factory;
/*
 * 发型接口
 * */
public interface HairInterface {

    //实现了发型
    public void draw();
}

定义两个实现类:

package com.Factory;

public class LeftHair implements HairInterface {
    /*
     * 画了一个左偏分发型
     * */
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println("----------实现了左偏发型------------");
    }
}

package com.Factory;

public class RightHair implements HairInterface {
    /*
     * 画了一个右偏分发型
     * */
    @Override
    public void draw() {
        // TODO Auto-generated method stub
        System.out.println("----------实现了右偏分发型------------");
    }
}

测试:不使用工厂的实现方式:

package com.Factory;
/*
 * 模拟客户端实现
 * */
public class SunnyTest {

    public static void main(String[] args) {

        //不用工厂的方式实现
        HairInterface left=new LeftHair();
        left.draw();
    }
}

这种方式很麻烦。

可以通过工厂模式解决:

工厂类:分别用普通的工厂类和通过反射实现的工厂类实现。

package com.Factory;
/*
 * 发型工厂
 * */
public class HairFactory {

    //普通的工厂方式
    public HairInterface getHair(String key)
    {
        if("left".equals(key))
        {
            return new LeftHair();
        }
        else if("Right".equals(key))
        {
            return new RightHair();
        }
        return null;
    }

    /*
     * 通过反射实现工厂
     * 根据类的名称来生产对象
     * */
    public HairInterface getHairByClass(String className)
    {
        try {
            HairInterface hair=(HairInterface)Class.forName(className).newInstance();
            return hair;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

分别用三种方式实现:

package com.Factory;
/*
 * 模拟客户端实现
 * */
public class SunnyTest {

    public static void main(String[] args) {

        //不用工厂的方式实现
        HairInterface left=new LeftHair();
        left.draw();

        //使用普通工厂的方式
        HairFactory factory=new HairFactory();
        HairInterface left2=factory.getHair("left");
        left2.draw();

        //使用反射实现的工厂
        HairInterface right=factory.getHairByClass("com.Factory.RightHair");
        right.draw();
    }

}

---恢复内容结束---

原文地址:https://www.cnblogs.com/alsf/p/8486262.html

时间: 2024-10-17 21:21:17

模式的秘密--工厂模式的相关文章

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

简单工厂模式.抽象工厂模式.工厂方法模式,这三种工厂模式都属于设计模式中的创建型模式,它们在形式和特点上也多少有些相似,其最终目的都是帮我们将对象的实例化部分取出来,进而优化系统架构,增强系统的扩展性,也就是说更好的体现开放封闭原则. 简单工厂模式: 概念: 简单工厂模式是类的创建模式,又叫做静态工厂方法模式,是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,涉及到工厂角色.抽象产品角色以及具体产品角色. 结构图: 分析: 一: 简单工厂类是整个模式的关键所在,包含了必要的逻辑判断,根据

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 根据抽象程度不同,PHP工厂模式分为:简单工厂模式.工厂方法模式和抽象工厂模式 简单工厂模式: /******代码在原文还是git上都有osgit地址 https://git.oschina.net/mjw/pattern.git  *******/ /** *简单工厂模式与工厂方法模式比较

php模式设计之 工厂模式

承接上篇php模式设计之 单例模式,(虽然好像关系不大).今天讲述第二种基础的模式设计——工厂模式. 那么何为工厂模式? 从名字来看,似乎看不出什么端倪.工厂模式,和生产有关?还是和生产流程有关?难道还和工厂领导有关?和领导秘书有关?秘书...     好了不卖关子了,所谓工厂模式还真和生产有关.生产什么呢?生产出来的是一个实例对象.通过什么设备生产?通过一个工厂类生产.怎么生产呢?工厂类调用自身静态方法来生产对象实例. 工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而

工厂方法模式And抽象工厂模式

一.工厂方法模式 简单工厂模式的缺陷就是类的创建太过于依赖工厂,一旦需要进行程序扩展,就必须修改工厂类的代码 这违背了背包原则. 而工厂方法模式针对这一问题进行了改进. public interface Sender { public void send(); } public interface producer { public Sender produce(); } public class MailFactory implements producer{ public Sender pr

java设计模式 -------- 创建模式 之 抽象工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品类,可以派生出多个具体产品类. 2. 一个抽象工厂类,可以派生出多个具体工厂类. 3. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式特点: 1. 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类. 2. 一个抽象工厂类,可以派生出多个具体工厂类. 3. 每个具体工厂类可以创建多个

java设计模式 -------- 创建模式 之 简单工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂模式是最常用的模式,因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a = new A(),工厂模式也是用来创建用来创建实例对象的,所以以后new时要多个心眼,是否可以考虑使用工厂模式. 简单工厂模式又可以分成三种模式: 1) 普通简单工厂模式 2) 多方法简单工厂模式 3) 多静态方法简单工厂模式 普通简单工厂模式: 举例:(简单的

工厂模式和抽象工厂模式

工厂模式: 定义一个用于创建对象的接口,让他的子类决定实例化哪个类.使类的实例化延迟到子类. 1.普通的工厂模式: public class GoodProduct implements Product { private String prodInfo = "Iam the good prod"; public String getProductInfo() { // TODO Auto-generated method stub return this.prodInfo; } pu

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

【C#设计模式——创建型模式】抽象工厂模式

抽象工厂模式比工厂模式具有更高层次的抽象性.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以选择这种模式.直接进入示例. 示例描述:完成花园的规划,多种花园种类,每个里面多种植物 编写一个基类Garden,Garden就是抽象工厂.它定义了具体类中的方法,并返回一系列相关类中的某个类. public class Garden { protected Plant center, shade, border; protected bool showCenter, showS