一.简单工厂模式
1.设计思路
建立一个工厂类,对实现统一接口的类进行实例的创建。实质就是由工厂类根据传入的参数,动态的决定应该创建哪个实例类接口
2.缺点
(1)集中了所有实例的创建逻辑,违背了高内聚责任分配原则
(2)如果要添加新的类,就需要修改工厂类,违背开放-关闭原则
3.代码实现
(1)人类
/**
* 产品的抽象接口 人类
* @author liaowp
*
*/
public interface Human {
public void say();
}
(2)男人 女人
public class Man implements Human {
/* say method
* @see com.roc.factory.Human#say()
*/
@Override
public void say() {
System.out.println("男人");
}
}public class Woman implements Human {
/* say method
* @see com.roc.factory.Human#say()
*/
@Override
public void say() {
System.out.println("女人");
}
}
(3)工厂
public class SampleFactory1 {
public static Human makeHuman(Class c){
Human human = null;
try {
human = (Human) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
System.out.println("不支持抽象类或接口");
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("没有足够权限,即不能访问私有对象");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("类不存在");
e.printStackTrace();
}
return human;
}
}
二.工厂方法模式
1.设计思想
工厂方法模式,又称为工厂模式,通过定义工厂父类负责定义创建对象的公共接口,而子类主要负责生成具体的对象,将类的实例化延迟到工厂类的子类中创建,即由子类来决定实例化哪个类
2优缺点
优点:解耦,提高了可扩展性
缺点:
(1)添加新的产品时,还需要添加对应的具体工厂类,系统中类的数目增加,增加了系统的复杂性
(2)一个具体的工厂只能创建一种具体产品
3.代码实现
(1)创建抽象产品类,定义产品的公共接口
abstract class Product{
public abstract void Show();
}
(2)创建抽象工厂类,定义工厂的公共接口
abstract class Factory{
public abstract Product Manufacture();
}
(3)创建产品实例,生产具体的产品
//具体产品A类
class ProductA extends Product{
@Override
public void Show() {
System.out.println("生产出了产品A");
}
}
//具体产品B类
class ProductB extends Product{
@Override
public void Show() {
System.out.println("生产出了产品B");
}
}
(4)创建具体工厂类,定义创建具体产品实例的方法
//工厂A类 - 生产A类产品
class FactoryA extends Factory{
@Override
public Product Manufacture() {
return new ProductA();
}
}
//工厂B类 - 生产B类产品
class FactoryB extends Factory{
@Override
public Product Manufacture() {
return new ProductB();
}
}
(5)外界调用不同工厂类的方法,创建不同的具体的产品实例
//生产工作流程
public class FactoryPattern {
public static void main(String[] args){
//客户要产品A
FactoryA mFactoryA = new FactoryA();
mFactoryA.Manufacture().Show();
//客户要产品B
FactoryB mFactoryB = new FactoryB();
mFactoryB.Manufacture().Show();
}
}
三 .抽象工厂模式
1.设计思想
为一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类
与工厂方法模式的区别是:工厂方法模式针对的是一个产品等级结构,抽象工厂模式针对的是多个产品等级结构
(比如工厂方法模式-A工厂生产阿迪,耐克...的裤子,B工厂生产耐克,阿迪...的衣服)
(抽象工厂模式-A生产阿迪的衣服,裤子..,B工厂生产耐克的衣服,裤子...)
2.优缺点
(1)优点:除了工厂方法的好处外,最主要的优点是在类内部对产品族的关联关系进行定义和描述
(2)缺点:产品族新增一个新产品,所有的工厂类都需要改变
3.代码实现
(1)产品接口
interface IProduct1 {
public void show();
}
interface IProduct2 {
public void show();
}
(2)产品实现
class Product1 implements IProduct1 {
public void show() {
System.out.println("这是1型产品");
}
}
class Product2 implements IProduct2 {
public void show() {
System.out.println("这是2型产品");
}
}
(3)工厂接口
interface IFactory {
public IProduct1 createProduct1();
public IProduct2 createProduct2();
}
(4)工厂实现
class Factory implements IFactory{
public IProduct1 createProduct1() {
return new Product1();
}
public IProduct2 createProduct2() {
return new Product2();
}
}
public class Client {
public static void main(String[] args){
IFactory factory = new Factory();
factory.createProduct1().show();
factory.createProduct2().show();
}
}